import axios from 'axios'
import { getToken, removeToken, isTokenExpired } from './auth'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = getToken()

    // 如果token存在
    if (token) {
      // 检查token是否过期
      if (isTokenExpired(token)) {
        removeToken()

        // 如果是登录请求，直接继续（避免死循环）
        if (config.url.includes('/login')) {
          return config
        }

        // 其他请求，跳转到登录页
        window.location.href = '/login?redirect=' + encodeURIComponent(window.location.pathname)
        return Promise.reject(new Error('Token已过期，请重新登录'))
      }

      // 添加Authorization头
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data

    // 这里根据你的后端约定处理业务逻辑
    // 示例：如果code不是20000，则视为错误
    if (res.code && res.code !== 20000) {
      // 50008: 非法token; 50012: 其他客户端登录; 50014: Token过期;
      if ([50008, 50012, 50014].includes(res.code)) {
        removeToken()
        window.location.href = '/login'
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.error('请求错误:', error) // 调试用

    // HTTP状态码处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          removeToken()
          window.location.href = '/login'
          break
        case 403:
          error.message = '拒绝访问'
          break
        case 404:
          error.message = `请求地址出错: ${error.response.config.url}`
          break
        case 408:
          error.message = '请求超时'
          break
        case 500:
          error.message = '服务器内部错误'
          break
        case 501:
          error.message = '服务未实现'
          break
        case 502:
          error.message = '网关错误'
          break
        case 503:
          error.message = '服务不可用'
          break
        case 504:
          error.message = '网关超时'
          break
        case 505:
          error.message = 'HTTP版本不受支持'
          break
        default:
          error.message = `未知错误: ${error.response.status}`
      }
    } else if (error.message.includes('timeout')) {
      error.message = '网络请求超时'
    } else if (error.message.includes('Network Error')) {
      error.message = '网络连接错误'
    }

    return Promise.reject(error)
  }
)

export default service
